#include "playscene.h"
#include<QDebug>
#include<QMenuBar>
#include<QPainter>
#include<pushbutton.h>
#include<QTimer>
#include<QLabel>
#include<mycoin.h>
#include<dataconfig.h>
#include<QPropertyAnimation>
#include<QSound>
//PlayScene::PlayScene(QWidget *parent) : QMainWindow(parent)
//{

//}
PlayScene::PlayScene(int levelNum)
{
    QString str=QString("进入了第 % 1关").arg(levelNum);
    qDebug()<<str;
    this->levelIndex=levelNum;

    //初始化游戏场景
    //设置固定大小
    this->setFixedSize(430,670);
    //设置图标
    this->setWindowIcon(QPixmap(":/new/prefix1/pic/coind.png"));
    //设置标题
    this->setWindowTitle("开玩啦");

    //创建菜单栏
      QMenuBar * bar=menuBar();
      setMenuBar(bar);
    //创建开始菜单
     QMenu * startMenu=bar->addMenu("开始");
     //创建退出菜单项
     QAction * quitAction=startMenu->addAction("坚持就是胜利");

     //点击退出，实现退出游戏
     connect(quitAction,&QAction::triggered,[=](){
         this->close();
     });


     //添加音效资源

     QSound * backSound = new QSound(":/new/prefix1/pic/TapButtonSound.wav",this);

     //翻金币音效
     QSound * flipSound= new QSound(":/new/prefix1/pic/ConFlipSound.wav",this);
     //胜利按钮音效
     QSound *winSound=new QSound(":/new/prefix1/pic/LevelWinSound.wav",this);

     //返回按钮
     pushbutton * backBtn = new pushbutton(":/new/prefix1/pic/BackButton.png",":/new/prefix1/pic/BackButtonSelected.png");
     backBtn->setParent(this);
     backBtn->move(this->width()-backBtn->width(),this->height()-backBtn->height());//横纵坐标

     //点击返回
     connect(backBtn,&pushbutton::clicked,[=](){
         qDebug() <<"翻金币场景中：点击了返回按钮";
         backSound->play();
         //告诉主场景 我返回了 主场景要监听一下chooselevelscene的返回
         //延时返回
         QTimer::singleShot(300,this,[=](){
          emit this->ChooseSceneBack();
        });

       });


     //显示当前关卡数字体
     QLabel * label=new QLabel;
     label->setParent(this);
     QFont font;
     font.setFamily("华文新魏");
     font.setPointSize(15);//字体大小
     QString str1 =QString("Level:%1").arg(this->levelIndex);
     //将字体设置到标签控件中
     label->setFont(font);
     label->setText(str1);
     label->setGeometry(30,this->height()-50,120,50);

     //初始化每个二位关卡的数组
      dataConfig config;
     for(int i=0;i<4;i++)
     {
         for(int j=0;j<4;j++)
         {
             this->gameArray[i][j]=config.mData[this->levelIndex][i][j];
         }
     }




     //胜利图片显示 默认在背景外
     QLabel * winLabel = new QLabel;
     QPixmap tmpPix;
     tmpPix.load(":/new/prefix1/pic/LevelCompletedDialogBg.png");
     winLabel->setPixmap(tmpPix);
     winLabel->setParent(this);
     winLabel->move((this->width() - tmpPix.width()) / 2, -400);



     //显示金币背景图案
     for(int i=0;i<4;i++)
     {
         for(int j=0;j<4;j++)
         {
             //绘制背景图片
             QPixmap pix=QPixmap(":/new/prefix1/pic/BoardNode.png");
             QLabel *label=new QLabel;
             label->setGeometry(0,0,pix.width() ,pix.height() );
             label->setPixmap(pix);
             label->setParent(this);
             label->move(115+i*50,250+j*50);


             //创建金币
             QString str;
            if(this->gameArray[i][j]==1)
             {
                //显示金币
                 str=":/new/prefix1/pic/Coin0001.png";
             }
             else
             {
                 str=":/new/prefix1/pic/Coin0008.png";
             }

             MyCoin *coin=new MyCoin(str);
             coin->setParent(this);
             coin->move(117+i*50,252+j*50);




             //给金币的属性赋值
             coin->posX=i;
             coin->posY=j;
             coin->flag=this->gameArray[i][j];//1正面0反面

             //将金币放入到金币的二维数组里面
             coinBtn[i][j]=coin;

             //点击金币，进行翻转
             connect(coin,&MyCoin::clicked,[=](){
                 //播放 翻金币的音效
                 flipSound->play();
                 //点击按钮，将所有的按钮先禁用
                 for(int i = 0 ; i < 4; i++)
                 {
                     for(int j = 0 ; j < 4 ; j++)
                     {
                         this->coinBtn[i][j]->isWin = true;
                     }
                 }
                 coin->changeFlag();
                 this->gameArray[i][j]=this->gameArray[i][j]==0?1:0;

                 //翻转周围金币
                 //延时翻转
                 QTimer::singleShot(300,this,[=](){
                     if(coin->posX+1<=3)//周围右侧金币翻转条件
                     {
                         coinBtn[coin->posX+1][coin->posY]->changeFlag();
                         this->gameArray[coin->posX+1][coin->posY]=this->gameArray[coin->posX+1][coin->posY]==0?1:0;
                     }
                     if(coin->posX-1>=0) // 周围左侧硬币的翻转条件
                     {
                         coinBtn[coin->posX-1][coin->posY]->changeFlag();
                         this->gameArray[coin->posX-1][coin->posY]=this->gameArray[coin->posX-1][coin->posY]==0?1:0;
                     }
                     if(coin->posY+1<=3) // 周围下侧硬币的翻转条件
                     {
                         coinBtn[coin->posX][coin->posY+1]->changeFlag();
                         this->gameArray[coin->posX][coin->posY+1]=this->gameArray[coin->posX][coin->posY+1]==0?1:0;
                     }
                     if(coin->posY-1>=0) // 周围上侧硬币的翻转条件
                     {
                         coinBtn[coin->posX][coin->posY-1]->changeFlag();
                         this->gameArray[coin->posX][coin->posY-1]=this->gameArray[coin->posX][coin->posY-1]==0?1:0;
                     }

                     //释放
                     for(int i = 0 ; i < 4; i++)
                     {
                         for(int j = 0 ; j < 4 ; j++)
                         {
                             this->coinBtn[i][j]->isWin = false;
                         }
                     }


                     //判断是否胜利
                     this->isWin=true;
                     for(int i=0;i<4;i++)
                     {
                         for(int j=0;j<4;j++){
                             if(coinBtn[i][j]->flag==false)//只要有一个是反面，即为失败
                             {
                                 this->isWin=false;
                                 break;
                             }
                         }
                     }

                     if(this->isWin==true){
                         //this->backBtn->flag = true;
                         //添加胜利音效
                         winSound->play();
                         //胜利了
                         qDebug() << "胜利了";
                         //将所有按钮胜利的标志改为 true,如果再次点击按钮直接return
                         for(int i=0;i<4;i++)
                         {
                             for(int j=0;j<4;j++){
                                 coinBtn[i][j]->isWin=true;
                             }
                         }
                         //将胜利图片砸下来
                         QPropertyAnimation * an = new QPropertyAnimation(winLabel,"geometry");
                         //设置时间间隔
                         an->setDuration(1000);
                         //设置开始位置
                         an->setStartValue(QRect(winLabel->x(),winLabel->y(),winLabel->width(),winLabel->height()));
                         //设置结束位置
                         an->setEndValue(QRect(winLabel->x(),winLabel->y() + 300,winLabel->width(),winLabel->height()));
                         //设置缓和曲线
                         an->setEasingCurve(QEasingCurve::OutBounce);
                         an->start();

                        /* QSound * soud1 = new QSound(":/new/prefix1/pic/LevelWinSound.wav",this);
                         soud1->play();

                         QTimer::singleShot(3000,[=](){
                             this->backBtn->m_flag = false;
                             //发送一个申请下一关的信号
                             soud1->stop();
                             qDebug() << "下一关啦！";
                             emit gotoNext(m_levelIndex);
                         });*/
                     }





                 });




             });








     }

  }
}













void PlayScene::paintEvent(QPaintEvent *){
    //创建背景
    QPainter painter(this);
    QPixmap pix;
    pix.load(":/new/prefix1/pic/back1");
    painter.drawPixmap(0,0,this->width(),this->height(),pix);

    //画背景上的图标
    pix.load(":/new/prefix1/pic/omo.png");
    pix = pix.scaled((int)pix.width()/2,(int)pix.height()/2);
    painter.drawPixmap(20,30,pix);

}
